import 'package:intl/intl.dart';
import 'package:flutter/foundation.dart';
import 'dart:convert';

enum LogLevel { info, warn, error, debug }
class Logger {

  static String _formatTimestamp(DateTime timestamp) {
    return DateFormat('yyyy-MM-dd HH:mm:ss').format(timestamp);
  }

  static const Map<LogLevel, String> _levelColors = {
    /* 
    32 Green
    33 Yellow
    31 Red
    34 Blue
    36 青色
     */
    LogLevel.info: '\x1B[33m',  // 青色
    LogLevel.warn: '\x1B[35m',  // 紫色
    LogLevel.error: '\x1B[31m', // Red
    LogLevel.debug: '\x1B[34m', // Blue
  };

  static const String _resetColor = '\x1B[0m';

  static dynamic _tryDecodeJson(dynamic message) {
    if (message is String) {
      try {
        final decoded = json.decode(message);
        return const JsonEncoder.withIndent('  ').convert(decoded);
      } catch (e) {
        return message;
      }
    }
    return message;
  }

  /// 日志输出方法
  static void log(
    dynamic message, {
    LogLevel level = LogLevel.info, // 默认日志等级
    String? tag, // 日志标签
    dynamic error, // 异常对象
    StackTrace? stackTrace, // 堆栈信息
  }) {
    // 如果是 release 模式，直接返回
    if (kReleaseMode) return;

    final timestamp = _formatTimestamp(DateTime.now());
    final logLevel = level.toString().split('.').last.toUpperCase();
    final tagString = tag != null ? "[$tag]" : "";
    final errorString = error != null ? "\nError: $error" : "";
    final stackTraceString = stackTrace != null ? "\nStackTrace: $stackTrace" : "";

    final decodedMessage = _tryDecodeJson(message);
    final color = _levelColors[level] ?? '';
    final logMessage = "$color $timestamp $logLevel $tagString: $_resetColor $decodedMessage$errorString$stackTraceString ";

    
    // ignore: avoid_print
    print(logMessage);
  }

  /// 简单快捷的日志方法
  static void info(String message, {String? tag}) {
    log(message, level: LogLevel.info, tag: tag);
  }

  static void warn(String message, {String? tag}) {
    log(message, level: LogLevel.warn, tag: tag);
  }


  /* 
  message：始终是主描述，说明发生了什么。
  tag：有助于分类日志，特别是复杂项目中。
  error：捕获的异常，方便查看问题的原因。
  stackTrace：提供上下文和详细调用路径，通常与 error 搭配使用。
  */
  static void error(String message, {String? tag, dynamic error, StackTrace? stackTrace}) {
    log(message, level: LogLevel.error, tag: tag, error: error, stackTrace: stackTrace);
  }

  static void debug(String message, {String? tag}) {
    log(message, level: LogLevel.debug, tag: tag);
  }
}